/**
 * API 相关常量定义
 * @description 定义 API 请求、响应和错误处理相关的常量
 */

/**
 * API 基础配置常量
 * @description 定义 API 的基础配置信息
 */
export const API_CONFIG = {
  /** API 基础路径 */
  BASE_URL: '/api',
  /** API 版本 */
  VERSION: 'v1',
  /** 请求超时时间（毫秒） */
  TIMEOUT: 30000,
  /** 重试次数 */
  RETRY_COUNT: 3,
  /** 重试间隔（毫秒） */
  RETRY_DELAY: 1000,
  /** 请求头 */
  HEADERS: {
    /** 内容类型 */
    CONTENT_TYPE: 'application/json',
    /** 接受类型 */
    ACCEPT: 'application/json',
    /** 字符编码 */
    CHARSET: 'utf-8'
  }
} as const;

/**
 * HTTP 状态码常量
 * @description 定义常用的 HTTP 状态码
 */
export const HTTP_STATUS = {
  /** 成功 */
  OK: 200,
  /** 已创建 */
  CREATED: 201,
  /** 已接受 */
  ACCEPTED: 202,
  /** 无内容 */
  NO_CONTENT: 204,
  /** 重定向 */
  MOVED_PERMANENTLY: 301,
  /** 临时重定向 */
  FOUND: 302,
  /** 未修改 */
  NOT_MODIFIED: 304,
  /** 错误请求 */
  BAD_REQUEST: 400,
  /** 未授权 */
  UNAUTHORIZED: 401,
  /** 禁止访问 */
  FORBIDDEN: 403,
  /** 未找到 */
  NOT_FOUND: 404,
  /** 方法不允许 */
  METHOD_NOT_ALLOWED: 405,
  /** 请求超时 */
  REQUEST_TIMEOUT: 408,
  /** 冲突 */
  CONFLICT: 409,
  /** 请求实体过大 */
  PAYLOAD_TOO_LARGE: 413,
  /** 请求过于频繁 */
  TOO_MANY_REQUESTS: 429,
  /** 服务器内部错误 */
  INTERNAL_SERVER_ERROR: 500,
  /** 服务不可用 */
  SERVICE_UNAVAILABLE: 503,
  /** 网关超时 */
  GATEWAY_TIMEOUT: 504
} as const;

/**
 * API 端点常量
 * @description 定义所有 API 端点路径
 */
export const API_ENDPOINTS = {
  /** 学生相关端点 */
  STUDENTS: {
    /** 学生列表 */
    LIST: '/students',
    /** 学生详情 */
    DETAIL: '/students/{id}',
    /** 创建学生 */
    CREATE: '/students',
    /** 更新学生 */
    UPDATE: '/students/{id}',
    /** 删除学生 */
    DELETE: '/students/{id}',
    /** 批量操作 */
    BATCH: '/students/batch',
    /** 学生统计 */
    STATISTICS: '/students/statistics',
    /** 学生搜索建议 */
    SUGGESTIONS: '/students/suggestions',
    /** 学生导入 */
    IMPORT: '/students/import',
    /** 学生导出 */
    EXPORT: '/students/export'
  },
  /** 课程相关端点 */
  COURSES: {
    /** 课程列表 */
    LIST: '/courses',
    /** 课程详情 */
    DETAIL: '/courses/{id}',
    /** 创建课程 */
    CREATE: '/courses',
    /** 更新课程 */
    UPDATE: '/courses/{id}',
    /** 删除课程 */
    DELETE: '/courses/{id}',
    /** 批量操作 */
    BATCH: '/courses/batch',
    /** 课程统计 */
    STATISTICS: '/courses/statistics',
    /** 课程搜索建议 */
    SUGGESTIONS: '/courses/suggestions',
    /** 课程导入 */
    IMPORT: '/courses/import',
    /** 课程导出 */
    EXPORT: '/courses/export'
  },
  /** 课程分类相关端点 */
  COURSE_CATEGORIES: {
    /** 分类列表 */
    LIST: '/course-categories',
    /** 分类树 */
    TREE: '/course-categories/tree',
    /** 分类详情 */
    DETAIL: '/course-categories/{id}',
    /** 创建分类 */
    CREATE: '/course-categories',
    /** 更新分类 */
    UPDATE: '/course-categories/{id}',
    /** 删除分类 */
    DELETE: '/course-categories/{id}',
    /** 批量操作 */
    BATCH: '/course-categories/batch',
    /** 分类统计 */
    STATISTICS: '/course-categories/statistics'
  },
  /** 课程安排模板相关端点 */
  SCHEDULE_TEMPLATES: {
    /** 模板列表 */
    LIST: '/schedule-templates',
    /** 模板详情 */
    DETAIL: '/schedule-templates/{id}',
    /** 创建模板 */
    CREATE: '/schedule-templates',
    /** 更新模板 */
    UPDATE: '/schedule-templates/{id}',
    /** 删除模板 */
    DELETE: '/schedule-templates/{id}',
    /** 批量操作 */
    BATCH: '/schedule-templates/batch',
    /** 模板统计 */
    STATISTICS: '/schedule-templates/statistics',
    /** 生成实例 */
    GENERATE_INSTANCES: '/schedule-templates/{id}/generate-instances'
  },
  /** 课程实例相关端点 */
  SCHEDULE_INSTANCES: {
    /** 实例列表 */
    LIST: '/schedule-instances',
    /** 实例详情 */
    DETAIL: '/schedule-instances/{id}',
    /** 创建实例 */
    CREATE: '/schedule-instances',
    /** 更新实例 */
    UPDATE: '/schedule-instances/{id}',
    /** 删除实例 */
    DELETE: '/schedule-instances/{id}',
    /** 批量操作 */
    BATCH: '/schedule-instances/batch',
    /** 实例统计 */
    STATISTICS: '/schedule-instances/statistics',
    /** 冲突检测 */
    CONFLICT_CHECK: '/schedule-instances/conflict-check',
    /** 混合课表 */
    MIXED_SCHEDULE: '/schedule-instances/mixed-schedule'
  },
  /** 数据管理相关端点 */
  DATA_MANAGEMENT: {
    /** 数据导出 */
    EXPORT: '/data/export',
    /** 数据导入 */
    IMPORT: '/data/import',
    /** 数据备份 */
    BACKUP: '/data/backup',
    /** 数据恢复 */
    RESTORE: '/data/restore',
    /** 数据统计 */
    STATISTICS: '/data/statistics'
  },
  /** 系统相关端点 */
  SYSTEM: {
    /** 系统信息 */
    INFO: '/system/info',
    /** 健康检查 */
    HEALTH: '/system/health',
    /** 版本信息 */
    VERSION: '/system/version'
  }
} as const;

/**
 * API 错误代码常量
 * @description 定义业务层面的错误代码
 */
export const API_ERROR_CODES = {
  /** 通用错误 */
  COMMON: {
    /** 未知错误 */
    UNKNOWN_ERROR: 'COMMON_UNKNOWN_ERROR',
    /** 参数错误 */
    INVALID_PARAMS: 'COMMON_INVALID_PARAMS',
    /** 数据不存在 */
    DATA_NOT_FOUND: 'COMMON_DATA_NOT_FOUND',
    /** 数据已存在 */
    DATA_ALREADY_EXISTS: 'COMMON_DATA_ALREADY_EXISTS',
    /** 操作失败 */
    OPERATION_FAILED: 'COMMON_OPERATION_FAILED',
    /** 权限不足 */
    PERMISSION_DENIED: 'COMMON_PERMISSION_DENIED'
  },
  /** 学生相关错误 */
  STUDENT: {
    /** 学生不存在 */
    NOT_FOUND: 'STUDENT_NOT_FOUND',
    /** 学号已存在 */
    ID_ALREADY_EXISTS: 'STUDENT_ID_ALREADY_EXISTS',
    /** 学生信息无效 */
    INVALID_INFO: 'STUDENT_INVALID_INFO',
    /** 学生有关联课程 */
    HAS_RELATED_COURSES: 'STUDENT_HAS_RELATED_COURSES'
  },
  /** 课程相关错误 */
  COURSE: {
    /** 课程不存在 */
    NOT_FOUND: 'COURSE_NOT_FOUND',
    /** 课程代码已存在 */
    CODE_ALREADY_EXISTS: 'COURSE_CODE_ALREADY_EXISTS',
    /** 课程信息无效 */
    INVALID_INFO: 'COURSE_INVALID_INFO',
    /** 课程有关联学生 */
    HAS_RELATED_STUDENTS: 'COURSE_HAS_RELATED_STUDENTS',
    /** 分类不存在 */
    CATEGORY_NOT_FOUND: 'COURSE_CATEGORY_NOT_FOUND'
  },
  /** 课表相关错误 */
  SCHEDULE: {
    /** 课表不存在 */
    NOT_FOUND: 'SCHEDULE_NOT_FOUND',
    /** 时间冲突 */
    TIME_CONFLICT: 'SCHEDULE_TIME_CONFLICT',
    /** 时间无效 */
    INVALID_TIME: 'SCHEDULE_INVALID_TIME',
    /** 学生不存在 */
    STUDENT_NOT_FOUND: 'SCHEDULE_STUDENT_NOT_FOUND',
    /** 课程不存在 */
    COURSE_NOT_FOUND: 'SCHEDULE_COURSE_NOT_FOUND',
    /** 实例生成失败 */
    INSTANCE_GENERATION_FAILED: 'SCHEDULE_INSTANCE_GENERATION_FAILED'
  },
  /** 数据相关错误 */
  DATA: {
    /** 导入失败 */
    IMPORT_FAILED: 'DATA_IMPORT_FAILED',
    /** 导出失败 */
    EXPORT_FAILED: 'DATA_EXPORT_FAILED',
    /** 格式错误 */
    FORMAT_ERROR: 'DATA_FORMAT_ERROR',
    /** 数据损坏 */
    CORRUPTED: 'DATA_CORRUPTED',
    /** 版本不兼容 */
    VERSION_INCOMPATIBLE: 'DATA_VERSION_INCOMPATIBLE'
  }
} as const;

/**
 * API 错误消息常量
 * @description 定义错误代码对应的中文消息
 */
export const API_ERROR_MESSAGES = {
  [API_ERROR_CODES.COMMON.UNKNOWN_ERROR]: '未知错误',
  [API_ERROR_CODES.COMMON.INVALID_PARAMS]: '参数错误',
  [API_ERROR_CODES.COMMON.DATA_NOT_FOUND]: '数据不存在',
  [API_ERROR_CODES.COMMON.DATA_ALREADY_EXISTS]: '数据已存在',
  [API_ERROR_CODES.COMMON.OPERATION_FAILED]: '操作失败',
  [API_ERROR_CODES.COMMON.PERMISSION_DENIED]: '权限不足',
  
  [API_ERROR_CODES.STUDENT.NOT_FOUND]: '学生不存在',
  [API_ERROR_CODES.STUDENT.ID_ALREADY_EXISTS]: '学号已存在',
  [API_ERROR_CODES.STUDENT.INVALID_INFO]: '学生信息无效',
  [API_ERROR_CODES.STUDENT.HAS_RELATED_COURSES]: '该学生有关联的课程，无法删除',
  
  [API_ERROR_CODES.COURSE.NOT_FOUND]: '课程不存在',
  [API_ERROR_CODES.COURSE.CODE_ALREADY_EXISTS]: '课程代码已存在',
  [API_ERROR_CODES.COURSE.INVALID_INFO]: '课程信息无效',
  [API_ERROR_CODES.COURSE.HAS_RELATED_STUDENTS]: '该课程有关联的学生，无法删除',
  [API_ERROR_CODES.COURSE.CATEGORY_NOT_FOUND]: '课程分类不存在',
  
  [API_ERROR_CODES.SCHEDULE.NOT_FOUND]: '课表不存在',
  [API_ERROR_CODES.SCHEDULE.TIME_CONFLICT]: '时间冲突',
  [API_ERROR_CODES.SCHEDULE.INVALID_TIME]: '时间无效',
  [API_ERROR_CODES.SCHEDULE.STUDENT_NOT_FOUND]: '学生不存在',
  [API_ERROR_CODES.SCHEDULE.COURSE_NOT_FOUND]: '课程不存在',
  [API_ERROR_CODES.SCHEDULE.INSTANCE_GENERATION_FAILED]: '课程实例生成失败',
  
  [API_ERROR_CODES.DATA.IMPORT_FAILED]: '数据导入失败',
  [API_ERROR_CODES.DATA.EXPORT_FAILED]: '数据导出失败',
  [API_ERROR_CODES.DATA.FORMAT_ERROR]: '数据格式错误',
  [API_ERROR_CODES.DATA.CORRUPTED]: '数据已损坏',
  [API_ERROR_CODES.DATA.VERSION_INCOMPATIBLE]: '数据版本不兼容'
} as const;

/**
 * 请求方法常量
 * @description 定义 HTTP 请求方法
 */
export const HTTP_METHODS = {
  /** GET 请求 */
  GET: 'GET',
  /** POST 请求 */
  POST: 'POST',
  /** PUT 请求 */
  PUT: 'PUT',
  /** PATCH 请求 */
  PATCH: 'PATCH',
  /** DELETE 请求 */
  DELETE: 'DELETE',
  /** HEAD 请求 */
  HEAD: 'HEAD',
  /** OPTIONS 请求 */
  OPTIONS: 'OPTIONS'
} as const;

/**
 * 内容类型常量
 * @description 定义常用的内容类型
 */
export const CONTENT_TYPES = {
  /** JSON */
  JSON: 'application/json',
  /** 表单数据 */
  FORM_DATA: 'multipart/form-data',
  /** URL 编码表单 */
  FORM_URLENCODED: 'application/x-www-form-urlencoded',
  /** 纯文本 */
  TEXT: 'text/plain',
  /** HTML */
  HTML: 'text/html',
  /** XML */
  XML: 'application/xml',
  /** 二进制流 */
  OCTET_STREAM: 'application/octet-stream'
} as const;

/**
 * 缓存策略常量
 * @description 定义 API 缓存策略
 */
export const CACHE_STRATEGIES = {
  /** 不缓存 */
  NO_CACHE: 'no-cache',
  /** 缓存优先 */
  CACHE_FIRST: 'cache-first',
  /** 网络优先 */
  NETWORK_FIRST: 'network-first',
  /** 仅缓存 */
  CACHE_ONLY: 'cache-only',
  /** 仅网络 */
  NETWORK_ONLY: 'network-only',
  /** 过期重新验证 */
  STALE_WHILE_REVALIDATE: 'stale-while-revalidate'
} as const;

/**
 * API 限流配置常量
 * @description 定义 API 请求限流配置
 */
export const RATE_LIMIT_CONFIG = {
  /** 默认限流配置 */
  DEFAULT: {
    /** 时间窗口（毫秒） */
    WINDOW_MS: 60 * 1000, // 1分钟
    /** 最大请求次数 */
    MAX_REQUESTS: 100
  },
  /** 严格限流配置 */
  STRICT: {
    /** 时间窗口（毫秒） */
    WINDOW_MS: 60 * 1000, // 1分钟
    /** 最大请求次数 */
    MAX_REQUESTS: 30
  },
  /** 宽松限流配置 */
  LOOSE: {
    /** 时间窗口（毫秒） */
    WINDOW_MS: 60 * 1000, // 1分钟
    /** 最大请求次数 */
    MAX_REQUESTS: 300
  }
} as const;

/**
 * 分页默认配置常量
 * @description 定义分页的默认配置
 */
export const PAGINATION_DEFAULTS = {
  /** 默认页码 */
  PAGE: 1,
  /** 默认每页数量 */
  PAGE_SIZE: 20,
  /** 每页数量选项 */
  PAGE_SIZE_OPTIONS: [10, 20, 50, 100],
  /** 最大每页数量 */
  MAX_PAGE_SIZE: 1000,
  /** 最大页码 */
  MAX_PAGE: 10000
} as const;

/**
 * 文件上传配置常量
 * @description 定义文件上传相关配置
 */
export const FILE_UPLOAD_CONFIG = {
  /** 最大文件大小（字节） */
  MAX_FILE_SIZE: 10 * 1024 * 1024, // 10MB
  /** 允许的文件类型 */
  ALLOWED_TYPES: [
    'application/json',
    'text/csv',
    'application/vnd.ms-excel',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
    'image/jpeg',
    'image/png',
    'image/gif',
    'application/pdf'
  ],
  /** 文件扩展名映射 */
  EXTENSION_MAP: {
    'application/json': '.json',
    'text/csv': '.csv',
    'application/vnd.ms-excel': '.xls',
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx',
    'image/jpeg': '.jpg',
    'image/png': '.png',
    'image/gif': '.gif',
    'application/pdf': '.pdf'
  }
} as const;